/**
 * 
 */
package fbv.distribuidora.produto.negocio;

import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Hashtable;
import java.util.Map;

import fbv.commun.dataTools.negocio.EntidadeDAO;
import fbv.commun.dataTools.servico.EntidadePadrao;
import fbv.commun.excecoes.FBVException;
import fbv.commun.excecoes.FBVSQLException;
import fbv.commun.util.Util;
import fbv.distribuidora.fornecedor.negocio.ControladorFornecedorImpl;
import fbv.distribuidora.fornecedor.servico.Fornecedor;
import fbv.distribuidora.produto.servico.Produto;

/**
 * @author Lenildo
 *
 */
public class ProdutoDAO extends EntidadeDAO {
	private static final String TABLE_NAME = "PRO_PRODUTO";

	private static final String TABLE_COLL_CHAVE_PRIMARIA = "PRO_ID";
	private static final String TABLE_COLL_NOME = "PRO_NOME";
	private static final String TABLE_COLL_FORNECEDOR = "FOR_FORNECEDOR_FOR_ID";
	private static final String TABLE_COLL_ATRIBUTOS = "PRO_ATRIBUTOS";
	private static final String TABLE_COLL_IMAGEM_URI = "PRO_IMAGEM_URI";
	private static final String TABLE_COLL_DESCRICAO = "PRO_DESCRICAO";
	private static final String TABLE_COLL_PRECO = "PRO_PRECO";
	private static final String TABLE_COLL_QUANTIDADE = "PRO_QUANTIDADE";

	private static ProdutoDAO instancia;

	static {
		instancia = new ProdutoDAO();
	}
	/**
	 * 
	 */	
	private ProdutoDAO(){

	}

	/* (non-Javadoc)
	 * @see fbv.commun.dataTools.negocio.EntidadeDAO#criarEntidade()
	 */
	@Override
	public EntidadePadrao criarEntidade() {
		return new ProdutoImpl();
	}

	/* (non-Javadoc)
	 * @see fbv.commun.dataTools.negocio.EntidadeDAO#criarEntidade(java.sql.ResultSet, boolean)
	 */
	@Override
	protected EntidadePadrao criarEntidade(ResultSet resultSet, boolean completa) throws FBVException {
		Produto produto = new ProdutoImpl(); 
		ControladorFornecedorImpl controladorFornecedor = new ControladorFornecedorImpl();

		try{
			produto.setId(resultSet.getInt(ProdutoDAO.TABLE_COLL_CHAVE_PRIMARIA));
			produto.setNome(resultSet.getString(ProdutoDAO.TABLE_COLL_NOME));
			produto.setFornecedor((Fornecedor)controladorFornecedor.consultar(resultSet.getInt(ProdutoDAO.TABLE_COLL_FORNECEDOR)));
			produto.setDescricao(resultSet.getString(ProdutoDAO.TABLE_COLL_DESCRICAO));
			produto.setImagemUri(resultSet.getString(ProdutoDAO.TABLE_COLL_IMAGEM_URI));
			produto.setPreco(BigDecimal.valueOf(resultSet.getDouble(ProdutoDAO.TABLE_COLL_PRECO)));
			produto.setQtdEstoque(resultSet.getInt(ProdutoDAO.TABLE_COLL_QUANTIDADE));
			
			// TODO [lenildo.mn] produto.setAtributos(atributos);
		}
		catch (SQLException e) {
			throw new FBVSQLException(e);
		}
		return produto;
	}

	public static EntidadeDAO getInstancia() {
		return instancia;
	}

	protected String getNomeCampoChave() {
		return TABLE_COLL_CHAVE_PRIMARIA;
	}

	protected String getTableName() {
		return TABLE_NAME;
	}

	protected Map obterParametrosSQL(EntidadePadrao entidadePadrao) {
		Produto produto = (Produto)entidadePadrao;
		Map parametros = new Hashtable();
		if (Util.isCampoPreenchido(produto.getId())) {
			parametros.put(TABLE_COLL_CHAVE_PRIMARIA, produto.getId());
		}
		parametros.put(TABLE_COLL_NOME, produto.getNome());
		parametros.put(TABLE_COLL_FORNECEDOR, produto.getFornecedor().getId());
		parametros.put(TABLE_COLL_PRECO, produto.getPreco());
		parametros.put(TABLE_COLL_QUANTIDADE, produto.getQtdEstoque());
		parametros.put(TABLE_COLL_DESCRICAO, produto.getDescricao());
		parametros.put(TABLE_COLL_IMAGEM_URI, produto.getImagemUri());
		//TODO [lenildo.mn] verificar.
		//parametros.put(TABLE_COLL_ATRIBUTOS, produto.getAtributos());

		return parametros;
	}

}
